cmake_minimum_required(VERSION 2.8)

# 工程名
project(Project)

# 兼容CMAKE旧版本
# 在这个命令中，CMP0046是一个策略标识，表示的是与CMake 3.11及以后版本中变量的可见性相关的策略。
cmake_policy(SET CMP0046 OLD)

## 保存工程路径
set(PROJECT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

## 保存输出路径
set(OUTPUT_PATH             ${PROJECT_PATH}/output)  # 主要用于生成固件包
set(LIBRARY_OUTPUT_PATH     ${PROJECT_PATH}/libs)     # 自己生成lib
set(EXECUTABLE_OUTPUT_PATH  ${PROJECT_PATH}/bin)      # bin


## 第三方库路径
set(THIRD_LIBS_PATH ${PROJECT_PATH}/3rdlibs)

## 链接库路径  编译的libs一般放在这个路径下
link_directories(${PROJECT_PATH}/libs)

## 打开编译警告
## -Wall     打开所有常见的警告
## -Wextra   打开额外的警告，用于提高代码质量
## -Wreorder 初始化的顺序与类声明的顺序不一样，其实类的初始化顺序是声明的顺序
## -Werror   所以警告都视为错误，一般慎用
## -Wno-unused-parameter  没有用的参数为警告
## -Wno-ignored-qualifiers 不忽略函数返回类型的类型限定
## -fPIC 作用于编译阶段，告诉编译器产生与位置无关代码
## -g3 编译器生成更丰富的调试信息
## -o3 是一个优化选项，告诉编译器优化我们的代码。
## fpermissive 向下兼容一些老的语法，但是会忽略一些错误
set(CMAKE_CXX_FLAGS     "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-parameter -Wno-ignored-qualifiers")

## 编译信息
set(CMAKE_CXX_STANDARD  14)
## todo
# set(CMAKE_C_COMPILER    "gcc")
# set(CMAKE_CXX_COMPILER  "g++")
set(CMAKE_C_FLAGS       "${CMAKE_C_FLAGS} -Wall -g3")
set(CMAKE_CXX_FLAGS     "${CMAKE_CXX_FLAGS} -Wall -g3 -O0 -fpermissive -fPIC -pthread")

## 工程信息
string(TIMESTAMP CURRENT_TIME "%Y-%m-%d %H:%M:%S")
cmake_host_system_information(RESULT HOSTNAME QUERY HOSTNAME)


#从文件中读取版本信息,将内容读入 PROGRAM_VERSION 变量中，该变量会去掉尾部的空格。当设置了变量 PROGRAM_VERSION ，就可以使用它来配置 version.hpp.in ，生成 generated/version.hpp 
if(EXISTS "${PROJECT_PATH}/conf/version/VERSION")
  file(READ "${PROJECT_PATH}/conf/version/VERSION" PROGRAM_VERSION)
  string(STRIP "${PROGRAM_VERSION}" PROGRAM_VERSION)
else()
  message(FATAL_ERROR "File $${PROJECT_PATH}/conf/VERSION not found")
endif()

string(REPLACE "-" ";" ver_names ${PROGRAM_VERSION})
list(GET ver_names 0 VERSION_NUM_LIST)
list(GET ver_names 1 MY_PROGRAM_VERSION_STAGE)

string(REPLACE "." ";" ver_list ${VERSION_NUM_LIST})
list(GET ver_list 0 MY_PROGRAM_VERSION_MAJOR)
list(GET ver_list 1 MY_PROGRAM_VERSION_MINOR)
list(GET ver_list 2 MY_PROGRAM_VERSION_PATCH)


## 打印工程信息
message("======================================================================")
message("Project        : ${PROJECT_NAME} ${PROJECT_CUSTOM_VERSION}")
message("C++ Standard   : ${CMAKE_CXX_STANDARD}")
message("G++ Version    : ${CMAKE_CXX_COMPILER_VERSION}")
message("Gcc Version    : ${CMAKE_C_COMPILER_VERSION}")
message("Running Env    : ${PROJECT_PLATFORM}")
message("Build Time     : ${CURRENT_TIME}")
message("Build Type     : ${CMAKE_BUILD_TYPE}")
message("Build Host     : ${HOSTNAME}")
message("Build Platform : ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION} ${CMAKE_SYSTEM_PROCESSOR}")
message("OUTPUT_PATH    : ${OUTPUT_PATH}")
message("VERSION        : ${PROGRAM_VERSION}")
message("======================================================================")
# generate file version.hpp based on version.hpp.in
configure_file(
    ${PROJECT_PATH}/conf/version/version.h.in
    ${PROJECT_PATH}/conf/version/version.h
    @ONLY
)

add_subdirectory(modules)
add_subdirectory(examples)